package com.cskaoyan.javase.array._8yanghui;

import java.util.Arrays;

/**
 * 杨辉三角（YangHui Triangle）指的是南宋时期数学家杨辉，根据北宋时期的数学家贾宪的作品（现已遗失），发现的一种几何排列规律，在数学中，它是二项式系数在三角形中的一种几何排列。大致图案如下：
 * 1
 * 1 1
 * 1 2 1
 * 1 3 3 1
 * 1 4 6 4 1
 * 1 5 10 10 5 1
 * ........
 *
 * 我们可以用一个二维数组去装杨辉三角的图案，把杨辉三角的每一行当成一个一维数组
 * 那么整体就表示一个二维数组。
 *
 *
 *
 * @since 09:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        printYangHui(10);
    }

    /**
     * 在控制台打印对应行数的杨辉三角
     * @since 9:37
     * @param line 表示杨辉三角的行数
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public static void printYangHui(int line) {
        // 1.需要创建一个int二维数组,用来存放杨辉三角的数值.
        // 1.1 line行数表示二维数组中一维数组的个数,其实就是二维数组的长度,所以既然知道长度,那么就用动态初始化
        int[][] yangHui = new int[line][];
        // 现在这个二维数组yangHui里都是默认值null,显然不能直接用,需要给其中的一维数组进行手动初始化

        // 遍历二维数组,给其中的一维数组初始化
        for (int i = 0; i < yangHui.length; i++) {
            // yangHui[i]是一维数组的引用,现在是默认值null,需要手动赋值指向一个int一维数组对象
            yangHui[i] = new int[i + 1];
        }

        System.out.println(Arrays.deepToString(yangHui));
        // 1.2 以上完成二维数组的创建工作,就可以开始给二维数组的元素赋值了

        // 2.按照杨辉三角的规律给二维数组的元素赋值
        /*
            杨辉三角元素取值的规律:
                1.第一行元素只有一个,就是1
                2.从第二行开始,首尾元素也是1
                3.从第三行开始,除掉首尾元素,其它元素的取值 = 上一行的元素 + 上一行左边的元素
                用表达式来体现就是
                arr[i][j] = arr[i-1][j] + arr[i-1][j-1]
         */
        // 2.1 给第一行第一个元素赋值为1
        yangHui[0][0] = 1;
        // 2.2 从第二行开始,给首尾元素赋值为1
        for (int i = 1; i < yangHui.length; i++) {
            // 给每一行的首元素赋值为1
            yangHui[i][0] = 1;
            // 给每一行的尾元素赋值为1
            // yangHui[i][yangHui[i].length - 1] = 1;
            // 因为每行的列数恰好等于行数
            yangHui[i][i] = 1;
        }
        System.out.println(Arrays.deepToString(yangHui));

        // 2.3 从第三行开始,给中间的元素赋值
        for (int i = 2; i < yangHui.length; i++) {
            // 需要嵌套for,来遍历一维数组中的每一行元素,但是不是每个元素都需要我们赋值的,因为首尾已经都是1了,只需要赋值中间元素
            for (int j = 1; j < yangHui[i].length - 1; j++) {
                yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
            }
        }
        System.out.println(Arrays.deepToString(yangHui));
        // 3.按照杨辉三角的规律遍历输出这个二维数组
        // 遍历打印二维数组,需要使用嵌套for循环
        for (int[] ints : yangHui) {
            for (int ele : ints) {
                System.out.print(ele + "\t");
            }
            System.out.println();
        }
    }
}
